package com.fdb.efp.esb.common.util;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Objects;

public class JsonLogUtil {

    private static Logger logger = LoggerFactory.getLogger(JsonLogUtil.class);

    // 输出最小日志信息长度
    public static final int MIN_LENGTH = 10;

    // 输出最大日志信息长度
    public static final int MAX_LENGTH = 50;

    // 计算输出日志信息的长度
    public static final int DIV = 3;

    // 日志信息BODY的KEY
    public static final String BODY_KEY = "BODY";

    /**
     * 需求编号：【2019D1204】（日志信息输出处理）
     * 问题编号：【2019D1204】（日志信息输出处理）
     * 开发人员：【ludayong】
     * 创建日期：【2019/11/28 14:12】
     * 功能描述：日志信息输出处理
     * 修改日期：【2019/11/28 14:12】
     * 修改描述：
     */
    public static String hideMsg(String msg) throws Exception {
        if (StringUtils.isBlank(msg)) {
            return "";
        }
        if (msg.length() < MIN_LENGTH) {
            return msg;
        }
        int num = msg.length() / DIV;
        num = num > MAX_LENGTH ? MAX_LENGTH : num;
        return StringUtils.left(msg, num).concat("***").concat(StringUtils.right(msg, num));
    }

    /**
     * 需求编号：【2019D1204】（日志信息输出处理）
     * 问题编号：【2019D1204】（日志信息输出处理）
     * 开发人员：【ludayong】
     * 创建日期：【2019/11/28 14:12】
     * 功能描述：日志信息输出处理
     * 修改日期：【2019/11/28 14:12】
     * 修改描述：
     */
    public static String changeJSONStrWithBody(String jsonStr, String key) {
        try {
            if (StringUtils.isBlank(jsonStr)) {
                return jsonStr;
            }
            if (jsonStr.indexOf(key) >= 0) {
                JSONObject jsonJo = JSONObject.parseObject(jsonStr);
                JSONObject bodyJo = jsonJo.getJSONObject(BODY_KEY);
                if (Objects.isNull(bodyJo)) {
                    return jsonStr;
                }
                String keyVal = bodyJo.getString(key);
                keyVal = hideMsg(keyVal);
                bodyJo.put(key, keyVal);
                jsonJo.put(BODY_KEY, bodyJo);
                return JSONObject.toJSONString(jsonJo);
            }
        } catch (Exception e) {
            logger.error("日志信息输出处理出现异常，异常信息" + e.getMessage());
            e.printStackTrace();
        }
        return jsonStr;
    }

    /**
     * 需求编号：【2019D1204】（日志信息输出处理）
     * 问题编号：【2019D1204】（日志信息输出处理）
     * 开发人员：【ludayong】
     * 创建日期：【2019/11/28 14:12】
     * 功能描述：日志信息输出处理
     * 修改日期：【2019/11/28 14:12】
     * 修改描述：
     */
    public static String changeJSONStr(String jsonStr, String key) {
        try {
            if (StringUtils.isBlank(jsonStr)) {
                return jsonStr;
            }
            if (jsonStr.indexOf(key) >= 0) {
                JSONObject jsonJo = JSONObject.parseObject(jsonStr);
                String keyVal = jsonJo.getString(key);
                keyVal = hideMsg(keyVal);
                jsonJo.put(key, keyVal);
                return JSONObject.toJSONString(jsonJo);
            }
        } catch (Exception e) {
            logger.error("日志信息输出处理出现异常，异常信息" + e.getMessage());
            e.printStackTrace();
        }
        return jsonStr;
    }
}